Raw data

Dataset downloaded from mgandal’s github repository.

Load and annotate data

# Load csvs
datExpr = read.csv('./../Data/RNAseq_ASD_datExpr.csv', row.names=1)
datMeta = read.csv('./../Data/RNAseq_ASD_datMeta.csv')

# 1. Group brain regions by lobes
# 2. Remove '/' from Batch variable: (It is recommended (but not required) to use only letters, numbers, 
#    and delimiters '_' or '.', in levels of factors as these are safe characters for column names in R
# 3. Transform Diagnosis into a factor variable
datMeta = datMeta %>% mutate(Brain_Region = as.factor(Region)) %>% 
                      mutate(Brain_lobe = ifelse(Brain_Region %in% c('BA4_6', 'BA9', 'BA24', 'BA44_45'), 'Frontal',
                                          ifelse(Brain_Region %in% c('BA3_1_2_5', 'BA7'), 'Parietal',
                                          ifelse(Brain_Region %in% c('BA38', 'BA39_40', 'BA20_37', 'BA41_42_22'), 'Temporal',
                                          'Occipital')))) %>%
                      mutate(Batch = as.factor(gsub('/', '.', RNAExtractionBatch)), 
                             Diagnosis = factor(Diagnosis_, levels=c('CTL','ASD'))) %>% 
                      dplyr::select(-Diagnosis_)


# GO Neuronal annotations: regex 'neuron' in GO functional annotations and label as neuronal the genes that make a match
GO_annotations = read.csv('./../Data/genes_GO_annotations.csv')
GO_neuronal = GO_annotations %>% filter(grepl('neuron', go_term)) %>% 
              mutate('ID'=as.character(ensembl_gene_id)) %>% 
              dplyr::select(-ensembl_gene_id) %>% distinct(ID) %>%
              mutate('Neuronal'=1)


# SFARI Genes
SFARI_genes = read_csv('./../../SFARI/Data/SFARI_genes_08-29-2019_w_ensembl_IDs.csv')
SFARI_genes = SFARI_genes[!duplicated(SFARI_genes$ID) & !is.na(SFARI_genes$ID),]


rm(GO_annotations)

Check sample composition

Data description taken from the dataset’s synapse entry: RNAseq data was generated from 88 postmortem cortex brain samples from subjects with ASD (53 samples from 24 subjects) and non-psychiatric controls (35 samples from 17 subjects), across four cortical regions encompassing all major cortical lobes – frontal, temporal, parietal, and occipital. Brain samples were obtained from the Harvard Brain Bank as part of the Autism Tissue Project (ATP).

print(paste0('Dataset includes ', nrow(datExpr), ' genes from ', ncol(datExpr), ' samples belonging to ', length(unique(datMeta$Subject_ID)), ' different subjects.'))
## [1] "Dataset includes 63682 genes from 88 samples belonging to 41 different subjects."


Filtering criteria previous to level of expression

getinfo = c('ensembl_gene_id','external_gene_id','chromosome_name','start_position',
            'end_position','strand','band','gene_biotype','percentage_gc_content')
mart = useMart(biomart='ENSEMBL_MART_ENSEMBL',
               dataset='hsapiens_gene_ensembl',
               host='feb2014.archive.ensembl.org') ## Gencode v19
datGenes = getBM(attributes=getinfo, filters=c('ensembl_gene_id'), values=rownames(datExpr), mart=mart)
## Cache found
datGenes = datGenes[match(rownames(datExpr), datGenes$ensembl_gene_id),]
datGenes$length = datGenes$end_position-datGenes$start_position

rm(getinfo, mart)


# 1. Filter genes with start or end position missing
to_keep = !is.na(datGenes$length)
datGenes = datGenes[to_keep,]
datExpr = datExpr[to_keep,]
rownames(datGenes) = datGenes$ensembl_gene_id


# 2. Filter genes that do not encode any protein
to_keep = datGenes$gene_biotype=='protein_coding'
datExpr = datExpr %>% filter(to_keep)
datGenes = datGenes %>% filter(to_keep)
rownames(datExpr) = datGenes$ensembl_gene_id
rownames(datGenes) = datGenes$ensembl_gene_id

# 3. Filter genes with low expression levels
# 3.1 Remove genes with zero expression in all of the samples
to_keep = rowSums(datExpr)>0
datGenes = datGenes[to_keep,]
datExpr = datExpr[to_keep,]

print(paste0('Filtered dataset includes ', nrow(datExpr), ' genes from ', ncol(datExpr),
             ' samples belonging to ', length(unique(datMeta$Subject_ID)), ' different subjects.'))
## [1] "Filtered dataset includes 19426 genes from 88 samples belonging to 41 different subjects."
print(paste0(length(unique(SFARI_genes$`gene-symbol`[SFARI_genes$ID %in% rownames(datExpr)])), ' SFARI genes remaining'))
## [1] "967 SFARI genes remaining"
# Save datasets before level of expression filtering
datExpr_original = datExpr
datGenes_original = datGenes
datMeta_original = datMeta

Filter criteria: Mean value

  • Filtering outlier samples (there aren’t many)

  • Creating DESeq object and normalising using vst transformation

  • Threshold: Mean expression value

thresholds = c(0, 0.1, seq(0.2, 2, 0.2), 2.5, 3, 5, 7.5, 10)

for(threshold in thresholds){
  
  datMeta = datMeta_original
  datExpr = datExpr_original
  datGenes = datGenes_original
  
  cat(paste0('\n\nFiltering with threshold: ', threshold,'\n'))
  to_keep = rowMeans(datExpr)>threshold
  datGenes = datGenes[to_keep,]
  datExpr = datExpr[to_keep,]
  
  # Filter outlier samples
  absadj = datExpr %>% bicor %>% abs
  netsummary = fundamentalNetworkConcepts(absadj)
  ku = netsummary$Connectivity
  z.ku = (ku-mean(ku))/sqrt(var(ku))
  
  to_keep = z.ku > -2
  datMeta = datMeta[to_keep,]
  datExpr = datExpr[,to_keep]
  
  cat(paste0('Removing ', sum(!to_keep), ' samples\n'))
  
  rm(absadj, netsummary, ku, z.ku, to_keep)
  
  
  # Create a DeseqDataSet object, estimate the library size correction and save the normalized counts matrix
  counts = datExpr %>% as.matrix
  rowRanges = GRanges(datGenes$chromosome_name,
                    IRanges(datGenes$start_position, width=datGenes$length),
                    strand=datGenes$strand,
                    feature_id=datGenes$ensembl_gene_id)
  se = SummarizedExperiment(assays=SimpleList(counts=counts), rowRanges=rowRanges, colData=datMeta)
  dds = DESeqDataSet(se, design =~Diagnosis)
  
  # Perform vst
  vsd = vst(dds)
  
  datExpr_vst = assay(vsd)
  datMeta_vst = colData(vsd)
  datGenes_vst = rowRanges(vsd)
  
  rm(counts, rowRanges, se, vsd)
  
  # Save summary results in dataframe
  if(threshold == thresholds[1]){
    mean_vs_sd_data = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
  } else {
    new_entries = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
    mean_vs_sd_data = rbind(mean_vs_sd_data, new_entries)
  }
} 
## 
## 
## Filtering with threshold: 0
## alpha: 1.000000
## Removing 7 samples
## 
## 
## Filtering with threshold: 0.1
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 0.2
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 0.4
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 0.6
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 0.8
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 1
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 1.2
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 1.4
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 1.6
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 1.8
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 2
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 2.5
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 3
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 5
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 7.5
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 10
## alpha: 1.000000
## Removing 6 samples
# Plot Mean vs SD
to_keep_1 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean<7] %>%
            as.character
to_keep_2 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean>=7]
to_keep_2 = to_keep_2 %>% sample(round(length(to_keep_2)/10)) %>% as.character

plot_data = mean_vs_sd_data[mean_vs_sd_data$ID %in% c(to_keep_1, to_keep_2),]

ggplotly(plot_data %>% ggplot(aes(Mean, SD)) + 
         geom_point(color='#0099cc', alpha=0.2, aes(id=ID, frame=threshold)) + 
         scale_x_log10() + scale_y_log10() + theme_minimal())
# Plot remaining genes
plot_data = mean_vs_sd_data %>% group_by(threshold) %>% tally

ggplotly(plot_data %>% ggplot(aes(threshold, n)) + geom_point() + geom_line() +
         theme_minimal() + ggtitle('Remaining genes for each filtering threshold'))
rm(new_entries, to_keep_1, to_keep_2, plot_data)

Filter criteria: Min count

  • Filtering outlier samples (there aren’t many)

  • Creating DESeq object and normalising using vst transformation

  • Threshold: minimum expression value

thresholds = seq(0,10)

for(threshold in thresholds){
  
  datMeta = datMeta_original
  datExpr = datExpr_original
  datGenes = datGenes_original
  
  cat(paste0('\n\nFiltering with threshold: ', threshold,'\n'))
  to_keep = apply(datExpr, 1, min) >= threshold
  datGenes = datGenes[to_keep,]
  datExpr = datExpr[to_keep,]
  
  # Filter outlier samples
  absadj = datExpr %>% bicor %>% abs
  netsummary = fundamentalNetworkConcepts(absadj)
  ku = netsummary$Connectivity
  z.ku = (ku-mean(ku))/sqrt(var(ku))
  
  to_keep = z.ku > -2
  datMeta = datMeta[to_keep,]
  datExpr = datExpr[,to_keep]
  
  cat(paste0('Removing ', sum(!to_keep), ' samples\n'))
  
  rm(absadj, netsummary, ku, z.ku, to_keep)
  
  
  # Create a DeseqDataSet object, estimate the library size correction and save the normalized counts matrix
  counts = datExpr %>% as.matrix
  rowRanges = GRanges(datGenes$chromosome_name,
                    IRanges(datGenes$start_position, width=datGenes$length),
                    strand=datGenes$strand,
                    feature_id=datGenes$ensembl_gene_id)
  se = SummarizedExperiment(assays=SimpleList(counts=counts), rowRanges=rowRanges, colData=datMeta)
  dds = DESeqDataSet(se, design =~Diagnosis)
  
  # Perform vst
  vsd = vst(dds)
  
  datExpr_vst = assay(vsd)
  datMeta_vst = colData(vsd)
  datGenes_vst = rowRanges(vsd)
  
  rm(counts, rowRanges, se, vsd)
  
  # Save summary results in dataframe
  if(threshold == thresholds[1]){
    mean_vs_sd_data = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
  } else {
    new_entries = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
    mean_vs_sd_data = rbind(mean_vs_sd_data, new_entries)
  }
}  
## 
## 
## Filtering with threshold: 0
## alpha: 1.000000
## Removing 7 samples
## 
## 
## Filtering with threshold: 1
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 2
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 3
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 4
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 5
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 6
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 7
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 8
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 9
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 10
## alpha: 1.000000
## Removing 6 samples
# Plot Mean vs SD
to_keep_1 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean<7] %>%
            as.character
to_keep_2 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean>=7]
to_keep_2 = to_keep_2 %>% sample(round(length(to_keep_2)/10)) %>% as.character

plot_data = mean_vs_sd_data[mean_vs_sd_data$ID %in% c(to_keep_1, to_keep_2),]

ggplotly(plot_data %>% ggplot(aes(Mean, SD)) + 
         geom_point(color='#0099cc', alpha=0.2, aes(id=ID, frame=threshold)) + 
         scale_x_log10() + scale_y_log10() + theme_minimal())
# Plot remaining genes
plot_data = mean_vs_sd_data %>% group_by(threshold) %>% tally

ggplotly(plot_data %>% ggplot(aes(threshold, n)) + geom_point() + geom_line() +
         theme_minimal() + ggtitle('Remaining genes for each filtering threshold'))
rm(new_entries, to_keep_1, to_keep_2, plot_data)

Filter criteria: Maximum number of allowed zero entries

  • Filtering outlier samples (there aren’t many)

  • Creating DESeq object and normalising using vst transformation

  • Threshold: Max number of allowed zero entries (using the ‘dual’ = minimum number of non-zero entries allowed)

# The largest number of zeros in a gene is 72
thresholds = 88-c(seq(72,7,-5),5,3,2,1,0)

for(threshold in thresholds){
  
  datMeta = datMeta_original
  datExpr = datExpr_original
  datGenes = datGenes_original
  
  cat(paste0('\n\nFiltering with threshold: ', threshold,'\n'))
  to_keep = apply(datExpr, 1, function(x) sum(x>0)) >= threshold
  datGenes = datGenes[to_keep,]
  datExpr = datExpr[to_keep,]
  
  # Filter outlier samples
  absadj = datExpr %>% bicor %>% abs
  netsummary = fundamentalNetworkConcepts(absadj)
  ku = netsummary$Connectivity
  z.ku = (ku-mean(ku))/sqrt(var(ku))
  
  to_keep = z.ku > -2
  datMeta = datMeta[to_keep,]
  datExpr = datExpr[,to_keep]
  
  cat(paste0('Removing ', sum(!to_keep), ' samples\n'))
  
  rm(absadj, netsummary, ku, z.ku, to_keep)
  
  
  # Create a DeseqDataSet object, estimate the library size correction and save the normalized counts matrix
  counts = datExpr %>% as.matrix
  rowRanges = GRanges(datGenes$chromosome_name,
                    IRanges(datGenes$start_position, width=datGenes$length),
                    strand=datGenes$strand,
                    feature_id=datGenes$ensembl_gene_id)
  se = SummarizedExperiment(assays=SimpleList(counts=counts), rowRanges=rowRanges, colData=datMeta)
  dds = DESeqDataSet(se, design =~Diagnosis)
  
  # Perform vst
  vsd = vst(dds)
  
  datExpr_vst = assay(vsd)
  datMeta_vst = colData(vsd)
  datGenes_vst = rowRanges(vsd)
  
  rm(counts, rowRanges, se, vsd)
  
  # Save summary results in dataframe
  if(threshold == thresholds[1]){
    mean_vs_sd_data = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
  } else {
    new_entries = data.frame('threshold'=threshold, 'ID'=rownames(datExpr_vst),
                                 'Mean'=rowMeans(datExpr_vst), 'SD'=apply(datExpr_vst,1,sd))
    mean_vs_sd_data = rbind(mean_vs_sd_data, new_entries)
  }
}  
## 
## 
## Filtering with threshold: 16
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 21
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 26
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 31
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 36
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 41
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 46
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 51
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 56
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 61
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 66
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 71
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 76
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 81
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 83
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 85
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 86
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 87
## alpha: 1.000000
## Removing 6 samples
## 
## 
## Filtering with threshold: 88
## alpha: 1.000000
## Removing 6 samples
# Plot Mean vs SD
to_keep_1 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean<7] %>%
            as.character
to_keep_2 = mean_vs_sd_data$ID[mean_vs_sd_data$threshold==thresholds[1] & mean_vs_sd_data$Mean>=7]
to_keep_2 = to_keep_2 %>% sample(round(length(to_keep_2)/10)) %>% as.character

plot_data = mean_vs_sd_data[mean_vs_sd_data$ID %in% c(to_keep_1, to_keep_2),]

ggplotly(plot_data %>% ggplot(aes(Mean, SD)) + 
         geom_point(color='#0099cc', alpha=0.2, aes(id=ID, frame=threshold)) + 
         scale_x_log10() + scale_y_log10() + theme_minimal())
# Plot remaining genes
plot_data = mean_vs_sd_data %>% group_by(threshold) %>% tally

ggplotly(plot_data %>% ggplot(aes(threshold, n)) + geom_point() + geom_line() +
         theme_minimal() + ggtitle('Remaining genes for each filtering threshold'))
rm(new_entries, to_keep_1, to_keep_2, plot_data)


Conclusion


Session info

sessionInfo()
## R version 3.6.0 (2019-04-26)
## Platform: x86_64-redhat-linux-gnu (64-bit)
## Running under: Scientific Linux 7.6 (Nitrogen)
## 
## Matrix products: default
## BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
## 
## locale:
##  [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
##  [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
##  [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] knitr_1.24                  dendextend_1.13.2          
##  [3] vsn_3.54.0                  WGCNA_1.68                 
##  [5] fastcluster_1.1.25          dynamicTreeCut_1.63-1      
##  [7] sva_3.34.0                  genefilter_1.68.0          
##  [9] mgcv_1.8-28                 nlme_3.1-139               
## [11] DESeq2_1.26.0               SummarizedExperiment_1.16.1
## [13] DelayedArray_0.12.2         BiocParallel_1.20.1        
## [15] matrixStats_0.55.0          Biobase_2.46.0             
## [17] GenomicRanges_1.38.0        GenomeInfoDb_1.22.0        
## [19] IRanges_2.20.2              S4Vectors_0.24.2           
## [21] BiocGenerics_0.32.0         biomaRt_2.42.0             
## [23] ggExtra_0.9                 GGally_1.4.0               
## [25] gridExtra_2.3               viridis_0.5.1              
## [27] viridisLite_0.3.0           RColorBrewer_1.1-2         
## [29] plotlyutils_0.0.0.9000      plotly_4.9.1               
## [31] glue_1.3.1                  reshape2_1.4.3             
## [33] forcats_0.4.0               stringr_1.4.0              
## [35] dplyr_0.8.3                 purrr_0.3.3                
## [37] readr_1.3.1                 tidyr_1.0.0                
## [39] tibble_2.1.3                ggplot2_3.2.1              
## [41] tidyverse_1.3.0            
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.3.1           backports_1.1.5        Hmisc_4.2-0           
##   [4] BiocFileCache_1.10.2   plyr_1.8.5             lazyeval_0.2.2        
##   [7] splines_3.6.0          crosstalk_1.0.0        robust_0.4-18.2       
##  [10] digest_0.6.23          foreach_1.4.7          htmltools_0.4.0       
##  [13] GO.db_3.10.0           fansi_0.4.1            magrittr_1.5          
##  [16] checkmate_1.9.4        memoise_1.1.0          fit.models_0.5-14     
##  [19] doParallel_1.0.15      cluster_2.0.8          limma_3.42.0          
##  [22] annotate_1.64.0        modelr_0.1.5           askpass_1.1           
##  [25] prettyunits_1.0.2      colorspace_1.4-1       rrcov_1.4-7           
##  [28] blob_1.2.0             rvest_0.3.5            rappdirs_0.3.1        
##  [31] haven_2.2.0            xfun_0.8               crayon_1.3.4          
##  [34] RCurl_1.95-4.12        jsonlite_1.6           impute_1.60.0         
##  [37] zeallot_0.1.0          survival_2.44-1.1      iterators_1.0.12      
##  [40] gtable_0.3.0           zlibbioc_1.32.0        XVector_0.26.0        
##  [43] DEoptimR_1.0-8         scales_1.1.0           mvtnorm_1.0-11        
##  [46] DBI_1.1.0              miniUI_0.1.1.1         Rcpp_1.0.3            
##  [49] xtable_1.8-4           progress_1.2.2         htmlTable_1.13.1      
##  [52] foreign_0.8-71         bit_1.1-15.1           preprocessCore_1.48.0 
##  [55] Formula_1.2-3          htmlwidgets_1.5.1      httr_1.4.1            
##  [58] acepack_1.4.1          pkgconfig_2.0.3        reshape_0.8.8         
##  [61] XML_3.98-1.20          nnet_7.3-12            dbplyr_1.4.2          
##  [64] locfit_1.5-9.1         labeling_0.3           tidyselect_0.2.5      
##  [67] rlang_0.4.2            later_1.0.0            AnnotationDbi_1.48.0  
##  [70] munsell_0.5.0          cellranger_1.1.0       tools_3.6.0           
##  [73] cli_2.0.1              generics_0.0.2         RSQLite_2.2.0         
##  [76] broom_0.5.3            evaluate_0.14          fastmap_1.0.1         
##  [79] yaml_2.2.0             bit64_0.9-7            fs_1.3.1              
##  [82] robustbase_0.93-5      mime_0.8               xml2_1.2.2            
##  [85] compiler_3.6.0         rstudioapi_0.10        curl_4.3              
##  [88] affyio_1.56.0          reprex_0.3.0           geneplotter_1.64.0    
##  [91] pcaPP_1.9-73           stringi_1.4.5          lattice_0.20-38       
##  [94] Matrix_1.2-17          vctrs_0.2.1            pillar_1.4.3          
##  [97] lifecycle_0.1.0        BiocManager_1.30.10    data.table_1.12.8     
## [100] bitops_1.0-6           httpuv_1.5.2           affy_1.64.0           
## [103] R6_2.4.1               latticeExtra_0.6-28    promises_1.1.0        
## [106] codetools_0.2-16       MASS_7.3-51.4          assertthat_0.2.1      
## [109] openssl_1.4.1          withr_2.1.2            GenomeInfoDbData_1.2.2
## [112] hms_0.5.3              grid_3.6.0             rpart_4.1-15          
## [115] rmarkdown_1.14         Cairo_1.5-10           shiny_1.4.0           
## [118] lubridate_1.7.4        base64enc_0.1-3